#include "stdint.h"
#include "stdio.h"
#include "sdkconfig.h"
#include "cpuusage.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/timers.h"

#include "DevicesKey.h"
#include "DevicesLed.h"
#include "DevicesQueue.h"
#include "DevicesTime.h"
#include "DevicesADC.h"

#include "taskKey.h"
#include "taskSoftTimer.h"


TimerHandle_t g_xTimersLedHandle = NULL;    /* Led定时刷新 */
TimerHandle_t g_xTimersKeyHandle = NULL;    /* Key定时读取 */
TimerHandle_t g_xTimersPrintHandle = NULL;  /* Print定时打印 */


/*
*   功能说明: 定时器led回调函数
*   形    参: 无
*   返 回 值: 无
*/
static void vSoftTimerLedCallback(TimerHandle_t pxTimer)
{
    (void)pxTimer;

    vLedMachine();
}

/*
*   功能说明: 定时器key回调函数
*   形    参: 无
*   返 回 值: 无
*/
static void vSoftTimerKeyCallback(TimerHandle_t pxTimer)
{
    (void)pxTimer;

    /* 有触发了新按键状态 */
    if(enumKeyMachine(&g_typeKey) != keyNormal)
    {
        /* 把有效的按键数据存入FIFO */
        enumQueuePushDatas(&g_TypeQueueKeyInput, &g_typeKey, sizeof(g_typeKey));

        printf("combo: %d, valueDown: %02X, timeDown: %d, valueUp: %02X, timeUp: %d, state: %02X\r\n",
                (int)g_typeKey.cntCombo,
                (int)g_typeKey.valueDown,
                (int)g_typeKey.timeDown,
                (int)g_typeKey.valueUp,
                (int)g_typeKey.timeUp,
                (int)g_typeKey.state);

       /* 给出信号量，以启动任务执行解析 */
       xTaskNotifyGive(g_TaskKeyHand);
    }
}

/*
*   功能说明: 定时器Print回调函数
*   形    参: 无
*   返 回 值: 无
*/
static void vSoftTimerPrintCallback(TimerHandle_t pxTimer)
{
    (void)pxTimer;

    // printf("Time: %s - CPU: %.2f%%\r\n", pcTimeToStrings(lTimestampGet() / 1000000LL), fCPUUsageGet() * 100.0f);

    // printf("ADC: %.3f\r\n", fADCGetChannelValue(ADC1_CHANNEL_0, 32));
}


/*
*   函 数 名: cSoftTimerInit
*   功能说明: 操作系统软件定时器初始化
*   形    参: 无
*   返 回 值: 错误值
*/
int8_t cSoftTimerInit(void)
{
    /*创建定时器*/
    g_xTimersLedHandle      = xTimerCreate("led",       20 / portTICK_PERIOD_MS,    pdTRUE, (void*)NULL, vSoftTimerLedCallback);
    xTimerStart(g_xTimersLedHandle, 200);

    g_xTimersKeyHandle      = xTimerCreate("key",       20 / portTICK_PERIOD_MS,    pdTRUE, (void*)NULL, vSoftTimerKeyCallback);
    xTimerStart(g_xTimersKeyHandle, 200);

    g_xTimersPrintHandle    = xTimerCreate("print",     1000 / portTICK_PERIOD_MS,  pdTRUE, (void*)NULL, vSoftTimerPrintCallback);
    xTimerStart(g_xTimersPrintHandle, 0);

    return 0;
}
